home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
011-020
/
amok13
/
rows
/
rowdemo.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
5KB
|
174 lines
(**********************************************************************
:Program. RowDemo.mod
:Contents. Test module for Rows
:Author. Nicolas Benezan [bne]
:Support. HeapSort adapted from "Programmierung in Modula-2",
:Support. Dal Cin/Lutz/Risse, Teubner Studienskripten
:Address. Postwiesenstr. 2, D7000 Stuttgart 60
:Phone. 711/333679
:Copyright. Public Domain
:Language. Modula-2
:Translator. M2Amiga AMSoft V3.2d
:Imports. MemSystem1.1 [bne]
:History. V1.0d [bne] 28.Jan.1989
:Bugs. doesn't test CompSize,Assign,Export,Import
:Bugs. HeapSort: element[0] is not sorted
**********************************************************************)
MODULE RowDemo;
FROM Rows IMPORT Row,Dim,Discard,Read,Write,High,CompSize,
RowsAllocProc,RowsDeallocProc;
FROM MemSystem IMPORT Allocate,Deallocate;
FROM InOut IMPORT WriteCard,WriteString,WriteLn;
FROM RandomNumber IMPORT RND,PutSeed;
FROM SYSTEM IMPORT ADR;
FROM Arts IMPORT Assert;
FROM Dos IMPORT DateStamp,Date;
TYPE ComponentType=CARDINAL;
CONST CharsPerColumn=5;
ColumnsPerLine=70 DIV CharsPerColumn;
VAR row:Row;
numbers,Pass:CARDINAL;
date:Date;
PROCEDURE InitMemSystem;
BEGIN
RowsAllocProc:=Allocate;
RowsDeallocProc:=Deallocate;
END InitMemSystem;
(**)
(* Fill the Row with random numbers *)
(**)
PROCEDURE FillRow(row:Row);
VAR Count,Random:CARDINAL;
BEGIN
FOR Count:=0 TO High(row) DO
Random:=RND(10000);
Write(row,Count,Random);
END;
END FillRow;
(**)
(* Write one element *)
(**)
PROCEDURE WriteElement(element:ComponentType);
BEGIN
WriteCard(element,CharsPerColumn);
END WriteElement;
(**)
(* Write the whole Row *)
(**)
PROCEDURE WriteRow(row:Row);
VAR Count,Column:CARDINAL;
Element:ComponentType;
BEGIN
Column:=0;
FOR Count:=0 TO High(row) DO
Read(row,Count,Element);
WriteElement(Element);
INC(Column);
IF Column=ColumnsPerLine THEN
WriteLn;
Column:=0;
END;
END;
WriteLn;
END WriteRow;
(**)
(* Heap Sort *)
(**)
PROCEDURE SortRow(row:Row);
VAR re,li:CARDINAL;
x,y,z:ComponentType;
PROCEDURE Less(x,y:ComponentType):BOOLEAN;
BEGIN
RETURN x<y;
END Less;
PROCEDURE sift;
VAR i,j:CARDINAL;
exit:BOOLEAN;
BEGIN
i:=li;
j:=2*i;
Read(row,i,x); (* x:=row[i] *)
exit:=FALSE;
WHILE (j<=re)AND NOT exit DO
IF j<re THEN
Read(row,j,y); (* y:=row[j] *)
Read(row,j+1,z); (* z:=row[j+1] *)
IF Less(y,z) THEN (* IF y<z *)
INC(j); (* j+1 *)
END;
END;
Read(row,j,y); (* y:=row[j] *)
exit:=NOT Less(x,y); (* x>=row[j] *)
IF NOT exit THEN
Write(row,i,y); (* row[i]:=row[j] *)
i:=j;
j:=2*i;
END;
END;
Write(row,i,x); (* row[i]:=x *)
END sift;
BEGIN
re:=High(row);
li:=(re DIV 2)+1;
WHILE li>1 DO
DEC(li);
sift;
END;
WHILE re>1 DO
Read(row,li,x); (* x:=row[li] *)
Read(row,re,y);
Write(row,li,y); (* row[li]:=row[re] *)
Write(row,re,x); (* row[re]:=x *)
DEC(re);
sift;
END;
END SortRow;
(**)
(* main loop *)
(**)
BEGIN
InitMemSystem;
DateStamp(ADR(date));
PutSeed(date.tick);
WriteString("Rows test module: 3 passes");
WriteLn;
FOR Pass:=1 TO 3 DO
WriteString("Pass ");WriteCard(Pass,1);
WriteLn;
numbers:=RND(1000)+500;
Assert(Dim(row,numbers,SIZE(ComponentType)),ADR("Dim() failed"));
WriteString("Row with ");
WriteCard(numbers,1);
WriteString(" elements created...");
WriteLn;
FillRow(row);
WriteString("... filled with random numbers:");
WriteLn;
WriteRow(row);
WriteString("... sorting...");
WriteLn;
SortRow(row);
WriteRow(row);
WriteString("discarding Row...");
WriteLn;
Discard(row);
WriteString("pass completed.");
WriteLn;WriteLn;
END;
END RowDemo.